﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Data;
using SBS;

namespace Controller
{
    /// <summary>
    /// Controller class for SBS
    /// </summary>
    /// <remarks>Singleton</remarks>
    public class Vaerksted
    {
        private VareKatalog vKatalog;
        private KundeKatalog kkatalog;
        private OrdreBog obog;
        private MekanikerKatalog mKatalog;
        private static Vaerksted instance = null;

        private Vaerksted()
        {
            
        }
        #region Properties
        public VareKatalog VKatalog
        {
            get
            {
                return vKatalog;
            }
            set { vKatalog = value; }
           
        }

        public KundeKatalog Kkatalog
        {
            get
            {
                return kkatalog;
            }
            set
            {
            }
        }

        public OrdreBog Obog
        {
            get
            {
                return obog;
            }
            set
            {
            }
        }
        public MekanikerKatalog Mkatalog
        {
            get { return mKatalog; }
            set { mKatalog = value; }
        }
        #endregion


        public static Vaerksted GetInstance()
        {
            if (instance == null)
                instance = new Vaerksted();
            return instance;

        }
        /// <summary>
        /// Dræber singleton instancen og dermed alle referencer.
        /// </summary>
        public static Vaerksted ResetInstance()
        {
            return new Vaerksted();
        }
       
        /// <summary>
        /// Kickof metode til use case Opret Ordrer
        /// </summary>
        public void NyOrdre()
        {
            kkatalog = new KundeKatalog();
            vKatalog = new VareKatalog();
            obog = new OrdreBog();
            mKatalog = new MekanikerKatalog();
            
        }

        
        
        /// <summary>
        ///  Henter info om kunde og denes scootere
        /// </summary>
        /// <param name="Knr"></param>

        public void HentKundeInfo(int Knr)
        {
            kkatalog.HentKundeInfo(Knr);
        }

        public void RedigeringAfKunde()
        {
            kkatalog = new KundeKatalog();

        }

        public void HentMekanikere(int CertNr)
        {
            mKatalog.HentMekanikere(CertNr);
        }

        public List<ArbejdsOpgaver> HentMekanikerKalender(int MekNr)
        {
            return mKatalog.HentMekanikerKalender(MekNr);
        }

       

        public void HentVareListe()
        {
            throw new System.NotImplementedException();
        }

        public double TilfoejOrdreLinie(OrdreLinie ol)
        {
            return this.Obog.AktivOrdre.TilfoejOrdreLinie(ol);
        }

        public void TilfoejMekanikerTilOrdre(int MekNr)
        {
            obog.AktivOrdre.TilfoejMekanikerTilOrdre(MekNr);
        }

        public bool GemOrdre(bool KontantSalg)
        {
            return obog.GemOrdre(kkatalog.AktivKunde, KontantSalg );
        }
        public bool Opretscooter(int Knr,Scooter S)
        {
            return Scooter.TilfojScooter(Knr, S);
        }
        public void OpretKunde()
        {
            Kkatalog = new KundeKatalog();
            Kkatalog.AktivKunde = new Kunde();
            
        }
        public bool GemKunde(out int Knr)
        {

            return this.kkatalog.GemKunde(out Knr);
        }

        public List<KeyValuePair<string, string>> HentUdlejningsStatus(DateTime UdlejningsDato)
        {
            return obog.HentUdlejningsStatus(UdlejningsDato);
        }
        public List<Scooter> HentKundensScooter(int Knr)
        {
            return HentKundensScooter(Knr);
        }
        public string HentByNavn(int postNr)
        {
           return kkatalog.HentByNavn(postNr);
        }
        public List<KeyValuePair<int, string>> HentCertifikatListe()
        {
            return DB.HentCertifikatListe();
        }
        /// <summary>
        /// Kickof metode til arbejdsregistrering
        /// </summary>
        public void VisArbejdsOversigt(int MekNr)
        {
            mKatalog = new MekanikerKatalog();
            obog = new OrdreBog();
            mKatalog.AktivMekaniker.ArbejdsOversigt = obog.HentArbejdsOversigt(MekNr);
        }

        public Dictionary<int, Ordre> HentArbejdsOversigt(int MekNr)
        {
            return this.obog.HentArbejdsOversigt(MekNr);
        }

        public void HentFaktura()
        {
            this.obog.HentFaktura();
        }

        public void Fakturering()
        {
            this.obog = new OrdreBog();
        }
        public void GemUfaktureretFaktura()
        {
            Obog.GemUfaktureretFaktura();
        }
        public void GemUbetalteFaktura()
        {
            Obog.GemUbetalteFaktura();
        }
        public void VisFaktura(int Onr)
        {
            obog.VisFaktura(Onr);
        }

        public bool OpdaterBetalingsStatus(int Onr)
        {
            return obog.OpdaterBetalingsStatus(Onr);
        }

        public bool RegistrerArbejde()
        {
            if (obog.RegistrerArbejde(mKatalog.AktivMekaniker.ArbejdesPaa))
            {
                mKatalog.AktivMekaniker.ArbejdsOversigt.Remove(mKatalog.AktivMekaniker.ArbejdesPaa.Onr);
                mKatalog.AktivMekaniker.ArbejdesPaa = new Ordre();
                return true;
            }
            else
                return false;

        }

        public void HentKundeSidsteBesøgsRapport(DateTime dato)
        {
            
            kkatalog.HentKundeSidsteBesøgsRapport(dato);

        }

        public void GemKundeSidsteBesøgsRapport(string sti,DateTime dato)
        {
            Printer.GemKundeSidsteBesøgsRapport(sti, kkatalog.Kunder, dato);
        }

        public bool OpdaterKunde()
        {
            return kkatalog.OpdaterKunde();
        }

        public void HentKundeListe()
        {
           
            kkatalog.HentKundeListe();
        }

        public void Rapportering()
        {
            kkatalog = new KundeKatalog();
        }

        public void HentScootereMedEjer()
        {
            kkatalog.HentScootereMedEjer();
        }

        public void Udlejning()
        {
            obog = new OrdreBog();
            
        }

        public void HentUdlejning(int Onr)
        {
            obog.AktivOrdre.HentUdlejning(Onr);
        }

        public bool OpdaterUdlejning()
        {
            return obog.AktivOrdre.OpdaterUdlejning();
        }

        public bool SeltUdlejning()
        {
            return obog.AktivOrdre.SletUdlejning();
        }
    }
}
